unit UnitServerKommunikation;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, mServer, mList, mQueue ,mTSpieler, mTLogZeile;

type
  TGame = (WaitForPlayer, GameStarted, Deck, PlayerChose, WaitForCard, PlayerChosedCard);
  TServerKommunikation = class(Server)
  private
        AlleSpieler: TList;
        Logs: TQueue;
        GameStatus : TGame;
        Karte:String;
  public
        constructor create(pPortNr:integer; pAlleSpieler: TList);
        procedure processNewConnection(pClientIP:string; pClientPort: integer);override;
        procedure processMessage(pClientIP: string; pClientPort: integer; pMessage:string);overload;override;
        procedure processClosedConnection(pClientIP:string; pClientPort: integer);overload;override;
        procedure setGame(pGame: TGame);
        function getLogs: TQueue;
        function getGame: TGame;
        function getKarte: String;
  end;

implementation

constructor TServerKommunikation.create(pPortNr:integer; pAlleSpieler: TList);
begin
  GameStatus := WaitForPlayer;
  AlleSpieler := pAlleSpieler;
  Logs := TQueue.create;
  inherited Create(pPortNr);
end;

procedure TServerKommunikation.processNewConnection(pClientIP:string; pClientPort: Integer);
var
        Spieler: TSpieler;
begin
        Spieler := TSpieler.create(pClientIP, pClientPort);
        Self.send(Spieler.GetIP,Spieler.getPort,'+OK MauMau!');
        AlleSpieler.append(Spieler);
        Logs.enqueue(TLogZeile.create('Neuer Spieler connected! (IP: ' + Spieler.getIP + ', Port: ' + IntToStr(Spieler.GetPort) + ')'));
end;

procedure TServerKommunikation.processMessage(pClientIP: string; pClientPort: integer; pMessage:string);
var
  i: Integer;
  Spieler, OnlineSpieler: TSpieler;
  temp: String;
begin
  Logs.enqueue(TLogZeile.create('Nachricht von IP: ' + pClientIP + ', Port: ' + IntToStr(pClientPort) + ' namens:'));
  Logs.enqueue(TLogZeile.create('  ' + pMessage));
  case GameStatus of
        WaitForPlayer:
        begin
          if Copy(pMessage,0,4) = 'USER' then
          begin
                AlleSpieler.toFirst;
                while AlleSpieler.hasAccess do
                begin
                        Spieler := AlleSpieler.getObject as TSpieler;
                        if (pClientIP = Spieler.GetIP) AND (pClientPort = Spieler.GetPort) AND not(Spieler.hasBenutzername) then
                        begin
                                Spieler.down;
                                i := length(pMessage) - 5;
                                Spieler.SetBenutzername(Copy(pMessage,6,i));
                                self.send(Spieler.getIP,Spieler.getPort,'+OK USER');
                                Self.sendToAll('ONLINELIST');
                                Logs.enqueue(TLogZeile.create('Antwort vom Server (an alle): ONLINELIST [...]'));
                                AlleSpieler.toFirst;
                                while AlleSpieler.hasAccess do
                                begin
                                        OnlineSpieler := AlleSpieler.getObject as TSpieler;
                                        if OnlineSpieler.hasBenutzername then
                                        begin
                                          self.sendToAll(OnlineSpieler.GetBenutzername)
                                        end;
                                        AlleSpieler.next;
                                end;
                                self.sendToAll('.');
                                Spieler.up;
                        end;
                        AlleSpieler.next;
                end;
          end else
          if Copy(pMessage,0,5) = 'START' then
          begin
                AlleSpieler.toFirst;
                while AlleSpieler.hasAccess do
                begin
                        Spieler := AlleSpieler.getObject as TSpieler;
                        if (pClientIP = Spieler.GetIP) AND (pClientPort = Spieler.GetPort) AND Spieler.hasBenutzername then
                        begin
                                GameStatus := GameStarted;
                                self.sendToAll('+OK START');
                        end;
                        AlleSpieler.next;
                end;
          end;

        end;
        WaitForCard:
        begin
                if Copy(pMessage,0,3) = 'LEG' then
                begin
                        Karte := Copy(pMessage,5,3);
                        GameStatus := PlayerChosedCard;
                end;
        end;
  end;
end;

procedure TServerKommunikation.processClosedConnection(pClientIP:string; pClientPort: integer);
begin
end;

procedure TServerKommunikation.setGame(pGame: TGame);
begin
        GameStatus := pGame;
end;

function TServerKommunikation.getLogs: TQueue;
begin
  result := Logs;
end;

function TServerKommunikation.getGame: TGame;
begin
  result := GameStatus;
end;

function TServerKommunikation.getKarte: String;
begin
  result := Karte;
end;

end.
